{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "; lazy infinite sequence with recursive definition\n",
    "(def fib-seq-lazy \n",
    "  ((fn rfib [a b] \n",
    "     (lazy-seq (cons a (rfib b (+ a b)))))\n",
    "   0 1))\n",
    "(take 20 fib-seq-lazy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "; 'unless' cannot be defined with a function because\n",
    "; it does not always evaluate both its arguments.\n",
    "(defmacro unless [pred a b]\n",
    "  `(if (not ~pred) ~a ~b))\n",
    "(unless false (println \"Will print\") (println \"Will not print\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(defn run [nvecs nitems nthreads niters]\n",
    "  (let [vec-refs (vec (map (comp ref vec)\n",
    "                           (partition nitems (range (* nvecs nitems)))))\n",
    "        swap #(let [v1 (rand-int nvecs)\n",
    "                    v2 (rand-int nvecs)\n",
    "                    i1 (rand-int nitems)\n",
    "                    i2 (rand-int nitems)]\n",
    "                (dosync\n",
    "                 (let [temp (nth @(vec-refs v1) i1)]\n",
    "                   (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))\n",
    "                   (alter (vec-refs v2) assoc i2 temp))))\n",
    "        report #(do\n",
    "                 (prn (map deref vec-refs))\n",
    "                 (println \"Distinct:\"\n",
    "                          (count (distinct (apply concat (map deref vec-refs))))))]\n",
    "    (report)\n",
    "    (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))\n",
    "    (report)))\n",
    "; When run, we see no values get lost or duplicated in the shuffle.\n",
    "; There are 36 distinct numbers before and after. \n",
    "(run 6 6 6 100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%python\n",
    "from beakerx import *\n",
    "pp = Plot(title=\"Title\", xLabel=\"Horizontal\", yLabel=\"Vertical\")\n",
    "pp.add(Line(displayName=\"Line\", x=[1, 4, 6, 8, 10],y=[3, 6, 4, 5, 9]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "press 'Tab' for autocomplete"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "press 'Shift' + 'Tab' for doc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Clojure",
   "language": "clojure",
   "name": "clojure"
  },
  "language_info": {
   "codemirror_mode": "Clojure",
   "file_extension": ".clj",
   "mimetype": "text/x-clojure",
   "name": "Clojure",
   "nbconverter_exporter": "",
   "version": "1.9.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
